package high.concurrent.pay.template;

import high.concurrent.vo.PayInfoVO;

import java.util.List;

/**
 * 支付回调模板
 * 1. 向各个服务发送消息，添加到消息记录表,状态未待发送
 * 2. 操作本地事务,更改订单状态
 * 3. 本地事务操作成功后，根据msgId在通知消息服务，把刚才的数据改为已发送
 */
public abstract class PayCallbackAbstractTemplate {

    public PayInfoVO payInfoVO;

    public PayCallbackAbstractTemplate(PayInfoVO payInfoVO){
        this.payInfoVO = payInfoVO;
    }

    /**
     * 模板执行流程
     */
    public final void processPayCallback(){

        // 向各个服务发送消息，添加到消息记录表,状态未待发送
        List<String> messageIds = toBeSend(payInfoVO);

        // 操作本地事务,更改订单状态
        updateLocalTransaction(payInfoVO);

        // 本地事务操作成功后，根据msgId在通知消息服务，把对应服务改为已发送，表示本地事务完成，可以进行下游事务可以执行了
        hasBeenSent(messageIds);
    }

    /**
     * 1. 向各个服务发送消息，添加到消息记录表,状态未待发送
     * @return 消息内容
     */
    public abstract List<String> toBeSend(PayInfoVO payInfoVO);

    /**
     * 2. 操作本地事务,更改订单状态
     * @param payInfoVO
     */
    public abstract void updateLocalTransaction(PayInfoVO payInfoVO);


    /**
     * 本地事务操作成功后，根据msgId在通知消息服务，把对应服务改为已发送，表示本地事务完成，可以进行下游事务可以执行了
     */
    public abstract void hasBeenSent(List<String> messageIds);

}
